package edu.gdpu.gc;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * @author mazebin
 * @date 2021年 07月16日 16:15:32
 * 演示软引用，配合引用队列
 */
public class SoftReferenceTest2 {
    public static final  int _4MB =4*1024*1024;
    public static void main(String[] args) {
      soft();
    }
    private static void soft(){
        List<SoftReference<byte[]>> list = new ArrayList<>();
        //引用队列
        ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
        for (int i = 0; i < 5; i++) {
            //关联了引用队列，当软引用所关联的byte[]被回收时，软引用会自动加入到队列中去
            SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB],queue);
            System.out.println(ref.get());
            list.add(ref);
            System.out.println(list.size());
        }
        //从队列中获取无用的软引用对象，并移除
        Reference<?extends byte[]> poll = queue.poll();
        while (poll != null){
            list.remove(poll);
            poll = queue.poll();
        }
        System.out.println("-----");
        for (SoftReference<byte[]> softReference : list) {
            System.out.println(softReference.get());
        }
    }

}
